package co.gov.medellin.ssti.sub.paoyer.common.exception;

/**
 * Representan el conjunto de errores de tipo usuario para el modulo common de
 * la aplicacion.
 * 
 */
public class CommonUserException implements ModuleExceptionInterface {

	/**
	 * Informacion del modulo al que pertenece el error.
	 */
	private static final int COMMON_MODULE = 9;

	/**
	 * Ocurre cuando un value object es null.
	 */
	public static final int VALUE_OBJECT_IS_NULL = COMMON_MODULE
			* USER_EXCEPTION + 1;

	/**
	 * Ocurre cuando un value object es null.
	 */
	public static final int REGISTER_NOT_FOUND = COMMON_MODULE * USER_EXCEPTION
			+ 2;

	/**
	 * Ocurre cuando un value object es null.
	 */
	public static final int NULL_POINTER_EXCEPTION = COMMON_MODULE
			* USER_EXCEPTION + 3;

	/**
	 * Ocurre cuando se duplica la llave primaria de una tabla.
	 */
	public static final int DUPLICATE_PRIMARY_KEY = COMMON_MODULE
			* USER_EXCEPTION + 4;

	/**
	 * Ocurre cuando se adiciona un registro mas grande que el determinado en la
	 * tabla.
	 */
	public static final int VALUE_TOO_LARGE = COMMON_MODULE * USER_EXCEPTION
			+ 5;

	/**
	 * Ocurre cuando se intenta eliminar un registro que tiene asociado otro
	 * registro.
	 */
	public static final int ANOTHER_RECORD_ASOCIATED = COMMON_MODULE
			* USER_EXCEPTION + 6;

	/**
	 * Esta tratando de adicionar un registro que contiene un caracter especial
	 */
	public static final int RECORD_CONTAIN_SPECIAL_CHARACTER = COMMON_MODULE
			* USER_EXCEPTION + 7;

	public static final int NOT_ALL_REQUIRED_FIELDS = COMMON_MODULE
			* USER_EXCEPTION + 8;

	public static final int NAME_DUPLICATE = COMMON_MODULE * USER_EXCEPTION + 9;

	public static final int NUMBER_CAN_NOT_BE_CERO = COMMON_MODULE
			* USER_EXCEPTION + 10;

	public static final int NOT_ALLOWED_RESOURCE = COMMON_MODULE
			* USER_EXCEPTION + 11;

	public static final int INCORRECT_DATE_FORMAT = COMMON_MODULE
			* USER_EXCEPTION + 12;

	public static final int INVALID_VALUE_FOR_MAIN_OPTION = COMMON_MODULE
			* USER_EXCEPTION + 13;

	/**
	 * Retorna un objeto ExceptionVO que contienen informacion detallada de un
	 * error que puede pasar en el modulo, segun el tipo de Excepcion pasado en
	 * el tipo.
	 * 
	 * @param messageId
	 *            int Identificador de la Excepcion definida para el modulo.
	 * @return ExceptionVO
	 */
	public ExceptionVO getExceptionVO(int exceptionId) throws SystemException {

		switch (exceptionId) {

		case VALUE_OBJECT_IS_NULL:
			return new ExceptionVO(CommonUserException.VALUE_OBJECT_IS_NULL,
					CommonUserException.COMMON_MODULE,
					"Value Object no puede ser null.",
					"El value object especificado es null.");

		case REGISTER_NOT_FOUND:
			return new ExceptionVO(
					CommonUserException.REGISTER_NOT_FOUND,
					CommonUserException.COMMON_MODULE,
					"Registro no encontrado",
					"Verifique que los datos suministrados para la busqueda del registro sean correctos.");

		case NULL_POINTER_EXCEPTION:
			return new ExceptionVO(CommonUserException.NULL_POINTER_EXCEPTION,
					CommonUserException.COMMON_MODULE,
					"Intentando trabajar con un valor nulo.",
					"Verifique que el dato ingresado sea distinto de nulo.");
		case DUPLICATE_PRIMARY_KEY:
			return new ExceptionVO(
					CommonUserException.DUPLICATE_PRIMARY_KEY,
					CommonUserException.COMMON_MODULE,
					"Ya existe un registro con el mismo valor del identificador.",
					"Cambie el valor del identificador del registro.");

		case VALUE_TOO_LARGE:
			return new ExceptionVO(
					CommonUserException.VALUE_TOO_LARGE,
					CommonUserException.COMMON_MODULE,
					"El registro que se intenta adicionar es demasiado grande.",
					"Cambie el tama�o del registro.");

		case ANOTHER_RECORD_ASOCIATED:
			return new ExceptionVO(
					CommonUserException.ANOTHER_RECORD_ASOCIATED,
					CommonUserException.COMMON_MODULE,
					"Imposible eliminar el registro.",
					"Existen otros registros asociados a este.");

		case RECORD_CONTAIN_SPECIAL_CHARACTER:
			return new ExceptionVO(
					CommonUserException.RECORD_CONTAIN_SPECIAL_CHARACTER,
					CommonUserException.COMMON_MODULE,
					"No se pueden adicionar caracteres especiales ",
					"intente con letras y numeros ");

		case NOT_ALL_REQUIRED_FIELDS:
			return new ExceptionVO(CommonUserException.NOT_ALL_REQUIRED_FIELDS,
					CommonUserException.COMMON_MODULE,
					"No han sido llenados todos los campos requeridos ",
					"Por favor, introcuzca todos los campos requeridos ");

		case NAME_DUPLICATE:
			return new ExceptionVO(CommonUserException.NAME_DUPLICATE,
					CommonUserException.COMMON_MODULE,
					"Ya existe un registro con el mismo nombre",
					"Por favor, cambie el nombre y vuelvalo a intentar");

		case NUMBER_CAN_NOT_BE_CERO:
			return new ExceptionVO(CommonUserException.NUMBER_CAN_NOT_BE_CERO,
					CommonUserException.COMMON_MODULE,
					"El numero no puede ser cero o nulo",
					"Por favor, cambie el numero y vuelvalo a intentar");

		case NOT_ALLOWED_RESOURCE:
			return new ExceptionVO(CommonUserException.NOT_ALLOWED_RESOURCE,
					CommonUserException.COMMON_MODULE,
					" No tiene permisos para acceder a este recurso",
					"No tiene permisos para acceder a este recurso");

		case INCORRECT_DATE_FORMAT:
			return new ExceptionVO(CommonUserException.INCORRECT_DATE_FORMAT,
					CommonUserException.COMMON_MODULE,
					" La fecha ingresada no tiene el formato correcto",
					"Vuelva a introducir la fecha");

		case INVALID_VALUE_FOR_MAIN_OPTION:
			return new ExceptionVO(
					CommonUserException.INVALID_VALUE_FOR_MAIN_OPTION,
					CommonUserException.COMMON_MODULE,
					" VALOR INVALIDO DE LOS PARAMETROS PARA LA OPCION PRINCIPAL DE MENU.",
					"Vuelva a introducir los campos de la opcion");
		default:
			throw new ExceptionIdNotFound(exceptionId);

		}

	}

	/**
	 * Obtiene un objeto <code>ModuleVO</code> que contiene el nombre del modulo
	 * y la clase que maneja las excepciones.
	 * 
	 * @return Objeto <code>ModuleVO</code> que contiene el nombre del modulo y
	 *         la clase que maneja las excepciones.
	 */
	public ModuleVO getModuleVO() {

		return new ModuleVO("COMMON", this.getClass().getName());
	}

}